package src.Fifteen;

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JProgressBar;

/*
 * 线程的优先级
 * 每个线程都具有各自的优先级，线程的优先级可以表明在程序中该线程的重要性，如果有很多线程处于就绪状态，
 * 系统会根据优先级来决定哪个线程进入运行状态。但并不意味着低优先级的线程得不到运行，而只是它运行的几率
 * 比较小，如垃圾回收线程的优先级就较低。
 * 线程的优先级可以使用setPriority()方法调整，如果使用该方法设置的优先级不在1~10之内，
 * 将产生IllegalArgumentException异常
 */
public class PriorityTest1 extends JFrame{
    /*
     * 每个线程都有一个"优先级"，优先级可以用整数表示，取值范围为0~10，0为最低优先级，10位最高优先级，
     * 当决定哪个线程需要调度时，首先查看是否存在优先级高的可调度线程，如果存在，就从中选择进行调度。
     * 当决定哪个线程需要调度时，首先查看是否存在优先级高的可调度线程，如果存在，就从中选择进行调度。
     * 当该线程的时间片到达之后，系统查看是否存在另一个优先级比较高的可调度线程，如果存在就调度。
     * 这样依次进行判断调度线程。本实例用两种方式来实现线程优先级排列家族等级-1静态常量表示；2用数字表示。
     * 实现线程优先级
     * (1)Thread类有三个优先级静态常量：MAX_PRIORITY为10，为线程最高优先级；
     * MIN_PRIORITY取值为1，为线程最低优先级；NORM_PRIORITY取值为5，为线程中间位置的优先级。
     * 默认情况下，线程的优先级为NORM_PRIORITY。
     * (2)Java中的线程在同等情况下，对于两个同时启动的线程，优先级高的线程先获取CPU资源，先被真正运行
     * ，优先级低的线程后获取CPU资源，后被执行。特殊情况在于现在计算机都是多核多线程的配置，
     * 有可能优先级低的线程比优先级高的线程先运行，优先级高的线程可能比优先级低的线程后运行，
     * 线程的执行先后还是由Java虚拟机调度决定的。
     */

    public PriorityTest1() {
        super();
        //创建进度条组件
        final JProgressBar pb1=new JProgressBar();
        final JProgressBar pb2=new JProgressBar();
        final JProgressBar pb3=new JProgressBar();
        final JProgressBar pb4=new JProgressBar();
        //设置进度条显示数字字符
        pb1.setStringPainted(true);
        pb2.setStringPainted(true);
        pb3.setStringPainted(true);
        pb4.setStringPainted(true);
        //将进度条放置在窗体合适位置。
        getContentPane().add(pb1,BorderLayout.NORTH);
        getContentPane().add(pb2,BorderLayout.SOUTH);
        getContentPane().add(pb3,BorderLayout.WEST);
        getContentPane().add(pb4,BorderLayout.EAST);
        //分别实例化四个线程
        Thread threadA=new Thread(new MyThread(pb1));
        Thread threadB=new Thread(new MyThread(pb2));
        Thread threadC=new Thread(new MyThread(pb3));
        Thread threadD=new Thread(new MyThread(pb4));
        setPriority("threadA", 5, threadA);
        setPriority("threadB", 5, threadB);
        setPriority("threadC", 4, threadC);
        setPriority("threadD", 3, threadD);
    }
    //定义设置线程的名称，优先级的方法
    public static void setPriority(String threadName,int priority,Thread t) {
        //设置线程优先级
        t.setPriority(priority);
        //设置线程名称
        t.setName(threadName);
        //启动线程
        t.start();
    }
    public static void init(JFrame frame,int width,int height) {
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setSize(width, height);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        init(new PriorityTest1(),500,500);
    }
    //定义一个实现Runnable接口的类
    private final class MyThread implements Runnable{
        private final JProgressBar bar;
        int count =0;
        private MyThread(JProgressBar bar) {
            this.bar=bar;
        }
        @Override
        public void run() {
            while(true) {
                bar.setValue(count+=10);//设置滚动条的值每次自增10
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println("当前线程被中断");
                }
            }

        }
    }


}
